/**
 * 日期专业处理工具
 * author: wh
 * @type {{getDayMS: (function(): number)}}
 */
var DateTools = {
    /**
     * 返回当前小时
     * @returns {number}
     */
    getNowHour: function(){
        var d = new Date();
        return (d.getHours()<10?'0'+d.getHours()+'':d.getHours());
    },
    /**
     * 返回当前分钟
     * @returns {number}
     */
    getNowMinute: function(){
        var d = new Date();
        return d.getMinutes();
    },
    /**
     * 返回当前时间戳
     * @returns {number}
     */
    getNowTime: function(){
        var d = new Date();
        return d.getTime();
    },
    /**
     * 一秒的毫秒数
     * @returns {number}
     */
    getSecondsMS: function(){
        return 1*1000;
    },
    /**
     * 一分钟的毫秒数
     * @returns {number}
     */
    getMinutesMS: function(){
        return 60*1000;
    },
    /**
     * 一小时的毫秒数
     * @returns {number}
     */
    getHoursMS: function(){
        return 60*60*1000;
    },
    /**
     * 一天的毫秒数
     * @returns {number}
     */
    getDayMS: function () {
        return 24*60*60*1000;
    },
    /**
     * 一天的秒数
     * @returns {number}
     */
    getDayS: function () {
        return 24*60*60;
    },
    /**
     * 一年的秒数
     * @param yearDays 默认一年365天
     * @returns {number}
     */
    getYearS: function (yearDays) {
        return (yearDays?yearDays:365)*24*60*60;
    },
    /**
     * 获取一个月的天数[最后一天]
     * wh
     * @param y 年份数字 eg：2019
     * @param m 月份数字 eg: 07
     * @returns {number} eg: 31
     */
    getDaysOfMonth: function (y, m) {
        var d = new Date(y, m, 0);
        return d.getDate();
    },
    /**
     * 当前年份
     * @returns {number}  eg：2019
     */
    getNowYear: function () {
        var date = new Date();
        return date.getFullYear();
    },
    /**
     * 当前月份
     * @returns {number} eg：07
     */
    getNowMonth: function () {
        var date = new Date();
        return ((date.getMonth() + 1)<10?'0'+(date.getMonth() + 1)+'':date.getMonth() + 1);
    },
    /**
     * 当前第几天
     * @returns {number} eg：04
     */
    getNowDay: function () {
        var date = new Date();
        return date.getDate();
    },
    /**
     * 返回当前日期[不包含时间]
     * @returns {string} eg: 2019-07-04
     */
    getNowDateTime: function(){
        return this.getNowYear()+'-'+this.getNowMonth()+'-'+this.getNowDay();
    },
    /**
     * 返回当前日期[包含时间]
     * @returns {string} eg: 2019-07-04 12:01:22
     */
    getNowDate: function(){
        var date = this.getNowYear()+'-'+this.getNowMonth()+'-'+this.getNowDay();
        return date+' '+this.getNowDateTimes();
    },
    /**
     * 返回当前时间[仅返回时间]
     * @returns {string} eg: 11:59:44
     */
    getNowDateTimes: function(){
        var date = new Date();
        return (date.getHours()<10?'0'+date.getHours()+'':date.getHours())+':'+
            (date.getMinutes()<10?'0'+date.getMinutes()+'':date.getMinutes())+':'+
            (date.getSeconds()<10?'0'+date.getSeconds()+'':date.getSeconds());
    },
    /**
     * 返回当前时间[仅返回时间,不含秒]
     * @returns {string} eg: 11:59
     */
    getNowDatesTimes: function(){
        var date = new Date();
        return (date.getHours()<10?'0'+date.getHours()+'':date.getHours())+
            ':'+date.getMinutes();
    },
    /**
     * 去年
     * @returns {number}
     */
    getLastYear: function () {
        var date = new Date();
        return date.getFullYear() - 1;
    },
    /**
     * 上个月
     * @returns {number} eg：06
     */
    getLastMonth: function(){
        var date = new Date();
        var m = date.getMonth();
        return m == 0?12:m;
    },
    /**
     * 昨天
     * @returns {number} eg：03
     */
    getYesterday: function () {
        var date = new Date();
        date.setTime(date.getTime() - this.getDayMS());
        return date.getDate();
    },
    /**
     * 时间减去秒数得到一个时间[不含时分秒]
     * (2019-05-06 - 86400秒) =  2019-05-05
     * wh
     * @param date eg: 2019-05-06 12:10:44
     * @param dateNum eg: 86400秒
     * @returns {string} eg: 2019-05-05
     */
    dateCutSecendsNumDay: function (date, dateNum) {
        var d = new Date(date);
        d.setTime(d.getTime() - (dateNum * 1000));
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },
    /**
     * 时间加上秒数得到一个时间[不含时分秒]
     * (2019-05-06 + 86400秒) =  2019-05-07
     * wh
     * @param date eg: 2019-05-06 12:10:44
     * @param dateNum eg: 10秒
     * @returns {string} eg: 2019-05-06 12:10:54
     */
    dateAddSecendsNum: function (date, dateNum) {
        var d = new Date(date);
        d.setTime(d.getTime() + (dateNum * 1000));
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },
    /**
     * 时间加上秒数得到一个时间[含时分秒]
     * (2019-05-06 12:10:44 - 10秒) =  2019-05-06 12:10:34
     * wh
     * @param d eg: 2019-05-06 12:10:44
     * @param dateNum eg: 10秒
     * @returns {string} eg: 2019-05-06 12:10:34
     */
    dateAddSecendsNumTime: function (d, dateNum) {
        var date = new Date(d);
        date.setTime(date.getTime() + (dateNum * 1000));
        return date.getFullYear() + '-' +
            ((date.getMonth() + 1)<10?'0'+(date.getMonth() + 1)+'':date.getMonth() + 1) +
            '-' + date.getDate()+ ' ' +
            (date.getHours()<10?'0'+date.getHours()+'':date.getHours())+':'+
            (date.getMinutes()<10?'0'+date.getMinutes()+'':date.getMinutes())+':'+
            (date.getSeconds()<10?'0'+date.getSeconds()+'':date.getSeconds());
    },
    /**
     * 时间减去天数得到一个时间
     * (2019-05-06 - 5天) =  2019-05-01
     * wh
     * @param date eg: 2019-05-06
     * @param dateNum eg: 5
     * @returns {string} eg: 2019-05-01
     */
    dateCutDayNum: function (date, dateNum) {
        var d = new Date(date);
        d.setTime(d.getTime() - (dateNum * (this.getDayMS())));
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },
    /**
     * 时间加上天数得到一个时间
     * (2019-05-06 + 1天) =  2019-05-07
     * wh
     * @param date eg: 2019-05-06
     * @param dateNum eg: 1
     * @returns {string} eg: 2019-05-07
     */
    dateAddDayNum: function (date, dateNum) {
        var d = new Date(date);
        d.setTime(d.getTime() + (dateNum * (this.getDayMS())));
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },
    /**
     * 时间减去月数得到一个时间
     * (2019-05-06 - 1月) =  2019-04-06
     * wh
     * @param date eg: 2019-05-06
     * @param dateNum eg: 1
     * @returns {string} eg: 2019-04-06
     */
    dateCutMonthNum: function (date, dateNum) {
        var d = new Date(date);
        d.setMonth(d.getMonth() - dateNum);
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },
    /**
     * 时间加上月数得到一个时间
     * (2019-05-06 + 1月) =  2019-06-06
     * wh
     * @param date eg: 2019-05-06
     * @param dateNum eg: 1
     * @returns {string} eg: 2019-06-06
     */
    dateAddMonthNum: function (date, dateNum) {
        var d = new Date(date);
        d.setMonth(d.getMonth() + dateNum);
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },
    /**
     * 时间减去年数得到一个时间
     * (2019-05-06 - 1年) =  2018-05-06
     * wh
     * @param date eg: 2019 | 2019-05-06
     * @param dateNum eg: 1
     * @returns {string} eg: 2018 | 2018-05-06
     */
    dateCutYearNum: function(date, dateNum){
        var d = new Date(date);
        d.setFullYear(d.getFullYear() - dateNum);
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },
    /**
     * 时间加上年数得到一个时间
     * (2019-05-06 + 1年) =  2020-05-06
     * wh
     * @param date eg: 2019
     * @param dateNum eg: 1
     * @returns {string} eg: 2020
     */
    dateAddYearNum: function(date, dateNum){
        var d = new Date(date);
        d.setFullYear(d.getFullYear() + dateNum);
        return d.getFullYear() + '-' +
            ((d.getMonth() + 1)<10?'0'+(d.getMonth() + 1)+'':d.getMonth() + 1) +
            '-' + d.getDate();
    },

    /**
     * 字符串日期相减
     * @param start 被减数 eg：2019-01-0
     * @param end 减数
     * @param t
     * @returns {number}
     */
    dateCutStartToEnd: function(start, end, t){
        var s = new Date(start);
        var e = new Date(end);
        switch (t.toLowerCase()) {
            //返回年数
            case 'y': break;
            //返回月数
            case 'month': break;
            //返回天数
            case 'd':
                return (1*e.getTime() - s.getTime()) / this.getDayMS();
                break;
            //返回小时数
            case 'h':
                return (1*e.getTime() - s.getTime()) / this.getHoursMS();
                break;
            //返回分钟数
            case 'm':
                return (1*e.getTime() - s.getTime()) / this.getMinutesMS();
                break;
            //返回秒数
            case 's':
                return (1*e.getTime() - s.getTime())/this.getSecondsMS();
                break;
            //返回毫秒数
            case 'ms':
                return (1*e.getTime() - s.getTime());
                break;
            //返回天数
            default: return (1*e.getTime() - s.getTime())/this.getDayMS();
        }
    },
    /**
     * 时间戳转日期
     * @param timestamp eg: 1234567891
     * @returns {string} eg: 2019-07-04
     */
    timestampToDate: function (timestamp) {
        var addzero = function(m){
            return m < 10? '0' + m:m;
        };
        timestamp = timestamp ? 1*timestamp : new Date();
        var t = new Date(timestamp);
        var y = t.getFullYear();
        var M = ((t.getMonth() + 1)<10?'0'+(t.getMonth() + 1)+'':t.getMonth() + 1);
        var d = t.getDate();
        var h = (t.getHours()<10?'0'+t.getHours()+'':t.getHours());
        var m = t.getMinutes();
        var s = t.getSeconds();
        var sign = '-';
        var sign2 = ':';
        return y+sign+addzero(M)+sign+addzero(d)+' '+
            addzero(h)+sign2+addzero(m)+sign2+addzero(s);
    },
    /**
     * 日期转时间戳
     * @param date
     * @returns {number}
     */
    dateToTimestamp: function (date) {
        var d = new Date(date);
        return d.getTime();
    }
};
